package ace.cmp.data.spring.data.jdbc.querydsl.rsql.core.manager;

import java.util.List;
import java.util.Map;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * Dto默认业务逻辑.
 *
 * @author caspar
 */
public interface DtoManager<EntityT, IdT, EntityDtoT> extends Manager<EntityT, IdT> {

  /**
   * 保存实体，新增或修改.保存全部字段（包含null字段)
   *
   * @param entityDto 数据实体
   * @return 实体id
   */
  IdT saveDto(EntityDtoT entityDto);

  /**
   * 保存实体，新增或修改
   *
   * @param entityDto         实体
   * @param saveNullFieldFlag 是否保存null字段
   * @return 实体id
   */
  IdT saveDto(EntityDtoT entityDto, boolean saveNullFieldFlag);

  /**
   * 保存实体，新增或修改,但忽略框架注解字段
   *
   * @param entityDto         实体
   * @param saveNullFieldFlag 是否保存null字段
   * @return 实体id
   */
  IdT saveDtoIgnore(EntityDtoT entityDto, boolean saveNullFieldFlag);

  /**
   * 新增
   *
   * @param entityDto 实体
   * @return 实体id
   */
  IdT addDto(EntityDtoT entityDto);

  /**
   * 新增
   *
   * @param entityDto         实体
   * @param saveNullFieldFlag 是否保存null字段
   * @return 实体id
   */
  IdT addDto(EntityDtoT entityDto, Boolean saveNullFieldFlag);

  /**
   * 新增,但忽略框架注解字段
   *
   * @param entityDto         实体
   * @param saveNullFieldFlag 是否保存null字段
   * @return 实体id
   */
  IdT addDtoIgnore(EntityDtoT entityDto, boolean saveNullFieldFlag);

  /**
   * 修改
   *
   * @param entityDto 实体
   * @return 实体id
   */
  IdT modifyDto(EntityDtoT entityDto);

  /**
   * 修改
   *
   * @param entityDto         实体
   * @param saveNullFieldFlag 是否保存null字段
   * @return 实体id
   */
  IdT modifyDto(EntityDtoT entityDto, boolean saveNullFieldFlag);

  /**
   * 修改,但忽略框架注解字段
   *
   * @param entityDto         实体
   * @param saveNullFieldFlag 是否保存null字段
   * @return 实体id
   */
  IdT modifyDtoIgnore(EntityDtoT entityDto, boolean saveNullFieldFlag);

  EntityDtoT getDtoById(IdT id);

  List<EntityDtoT> getDtoListByIdIn(List<IdT> ids);

  Map<IdT, EntityDtoT> getDtoMapByIdIn(List<IdT> ids);

  Page<EntityDtoT> searchDto(String query, Pageable pageable);

  EntityT convertToEntity(EntityDtoT entityDto);

  List<EntityT> convertToEntity(List<EntityDtoT> entities);

  EntityDtoT convertToEntityDto(EntityT entity);

  List<EntityDtoT> convertToEntityDto(List<EntityT> entities);
}
